package com.ncwebinc.hellolistview;

import com.ncwebinc.hellolistview.base.productos;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.LiveFolders;
import android.text.TextUtils;
import android.util.Log;

import java.util.HashMap;

/**
 * Provides access to a database of notes. Each note has a title, the note
 * itself, a creation date and a modified data.
 */

@SuppressWarnings("unused")
public class ProdProvider extends ContentProvider {

    private static final String TAG = "hello benderProvider";

    private static final String DATABASE_NAME = "com_ncwebinc_vender_data.db";
    private static final int DATABASE_VERSION = 1;
    private static final String PRODUCTO_TABLE_NAME = "producto";

    private static HashMap<String, String> sProductosProjectionMap;
    private static HashMap<String, String> sLiveFolderProjectionMap;

    private static final int PRODUCTOS = 1;
    private static final int PROD_ID = 2;
    private static final int LIVE_FOLDER_PROD = 3;

    private static final UriMatcher sUriMatcher;

    /**
     * This class helps open, create, and upgrade the database file.
     */
    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + PRODUCTO_TABLE_NAME + " ("
                    + productos.id_prod + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + productos.cod_prod + " TEXT,"
                    + productos.num_serie + " TEXT,"
                    + productos.descrip_prod + " TEXT,"
                    + productos.id_subcat + " INTEGER,"
                    + productos.nom_prod + " TEXT,"
                    + productos.marca_prod + " TEXT,"
                    + productos.mod_prod + " TEXT,"
                    + productos.cont_uni + " TEXT,"
                    + productos.uni_min + " TEXT,"
                    + productos.cont_uni_med + " TEXT,"
                    + productos.contenido + " INTEGER,"
                    + productos.peso_neto + " INTEGER,"
                    + productos.alto_cm + " INTEGER,"
                    + productos.ancho_cm + " INTEGER,"
                    + productos.fondo_cm + " INTEGER,"
                    + productos.fabr + " TEXT,"
                    + productos.fam_nec + " TEXT,"
                    + productos.fam_prod + " TEXT,"
                    + productos.clase_prod + " TEXT,"
                    + productos.linea_prod + " TEXT,"
                    + productos.tipo_prod + " TEXT,"
                    + productos.imagen + " INTEGER,"
                    + productos.hot + " INTEGER"
                    + ");");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS producto");
            onCreate(db);
        }
    }

    private DatabaseHelper mOpenHelper;

    @Override
    public boolean onCreate() {
        mOpenHelper = new DatabaseHelper(getContext());
        mOpenHelper.getWritableDatabase();
        Log.w(TAG, "ONCREATE.............");
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        qb.setTables(PRODUCTO_TABLE_NAME);
        Log.w(TAG, "QUERY.............");

        switch (sUriMatcher.match(uri)) {
        case PRODUCTOS:
            qb.setProjectionMap(sProductosProjectionMap);
            break;

        case PROD_ID:
            qb.setProjectionMap(sProductosProjectionMap);
            qb.appendWhere(productos.id_prod + "=" + uri.getPathSegments().get(1));
            break;

        case LIVE_FOLDER_PROD:
            qb.setProjectionMap(sLiveFolderProjectionMap);
            break;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        // If no sort order is specified use the default
        String orderBy;
        if (TextUtils.isEmpty(sortOrder)) {
            orderBy = base.productos.DEFAULT_ORDEN;
        } else {
            orderBy = sortOrder;
        }

        // Get the database and run the query
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

        // Tell the cursor what uri to watch, so it knows when its source data changes
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    @Override
    public String getType(Uri uri) {
        Log.w(TAG, "GETTYPE.............");
        switch (sUriMatcher.match(uri)) {
        case PRODUCTOS:
        case LIVE_FOLDER_PROD:
            return productos.CONTENT_TYPE;

        case PROD_ID:
            return productos.CONTENT_ITEM_TYPE;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues initialValues) {
        Log.w(TAG, "INSERT.............");
        // Validate the requested uri
        if (sUriMatcher.match(uri) != PRODUCTOS) {
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        ContentValues values;
        if (initialValues != null) {
            values = new ContentValues(initialValues);
        } else {
            values = new ContentValues();
        }

        Long now = Long.valueOf(System.currentTimeMillis());
        //Resources res = Resources.getResources();
        //String planets = (String) this.getText(R.string.title_create);

        // Make sure that the fields are all set
        /*if (values.containsKey(base.productos.id_prod) == false) {
            values.put(base.productos.id_prod, now);
        }*/
        if (values.containsKey(base.productos.cod_prod) == false) {
            values.put(base.productos.cod_prod, now);
        }
        if (values.containsKey(base.productos.num_serie) == false) {
            values.put(base.productos.num_serie, now);
        }
        if (values.containsKey(base.productos.descrip_prod) == false) {
            values.put(base.productos.descrip_prod, now);
        }
        if (values.containsKey(base.productos.id_subcat) == false) {
            values.put(base.productos.id_subcat, now);
        }
        if (values.containsKey(base.productos.nom_prod) == false) {
            values.put(base.productos.nom_prod, TAG);
        }
        if (values.containsKey(base.productos.marca_prod) == false) {
            values.put(base.productos.marca_prod, now);
        }
        if (values.containsKey(base.productos.mod_prod ) == false) {
            values.put(base.productos.mod_prod, now);
        }
        if (values.containsKey(base.productos.cont_uni) == false) {
            values.put(base.productos.cont_uni, now);
        }
        if (values.containsKey(base.productos.uni_min) == false) {
            values.put(base.productos.uni_min, now);
        }
        if (values.containsKey(base.productos.cont_uni_med) == false) {
            values.put(base.productos.cont_uni_med, now);
        }
        if (values.containsKey(base.productos.contenido) == false) {
            values.put(base.productos.contenido, now);
        }
        if (values.containsKey(base.productos.peso_neto) == false) {
            values.put(base.productos.peso_neto, now);
        }
        if (values.containsKey(base.productos.alto_cm) == false) {
            values.put(base.productos.alto_cm, now);
        }
        if (values.containsKey(base.productos.ancho_cm) == false) {
            values.put(base.productos.ancho_cm, now);
        }
        if (values.containsKey(base.productos.fondo_cm) == false) {
            values.put(base.productos.fondo_cm, now);
        }
        if (values.containsKey(base.productos.fabr) == false) {
            values.put(base.productos.fabr, now);
        }
        if (values.containsKey(base.productos.fam_nec) == false) {
            values.put(base.productos.fam_nec, now);
        }
        if (values.containsKey(base.productos.fam_prod) == false) {
            values.put(base.productos.fam_prod, now);
        }
        if (values.containsKey(base.productos.clase_prod) == false) {
            values.put(base.productos.clase_prod, now);
        }
        if (values.containsKey(base.productos.linea_prod) == false) {
            values.put(base.productos.linea_prod, now);
        }
        if (values.containsKey(base.productos.tipo_prod) == false) {
            values.put(base.productos.tipo_prod, now);
        }
        if (values.containsKey(base.productos.imagen) == false) {
            values.put(base.productos.imagen, now);
        }
        if (values.containsKey(base.productos.hot) == false) {
            values.put(base.productos.hot, now);
        }

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        long rowId = db.insert(PRODUCTO_TABLE_NAME, productos.hot, values);
        if (rowId > 0) {
            Uri noteUri = ContentUris.withAppendedId(base.productos.CONTENT_URI, rowId);
            getContext().getContentResolver().notifyChange(noteUri, null);
            return noteUri;
        }

        throw new SQLException("Failed to insert row into " + uri);
    }

    @Override
    public int delete(Uri uri, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        Log.w(TAG, "DELETE.............");
        int count;
        switch (sUriMatcher.match(uri)) {
        case PRODUCTOS:
            count = db.delete(PRODUCTO_TABLE_NAME, where, whereArgs);
            break;

        case PROD_ID:
            String prodId = uri.getPathSegments().get(1);
            count = db.delete(PRODUCTO_TABLE_NAME, productos.id_prod + "=" + prodId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
            break;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        Log.w(TAG, "UPDATE.............");
        int count;
        switch (sUriMatcher.match(uri)) {
        case PRODUCTOS:
            count = db.update(PRODUCTO_TABLE_NAME, values, where, whereArgs);
            break;

        case PROD_ID:
            String prodId = uri.getPathSegments().get(1);
            count = db.update(PRODUCTO_TABLE_NAME, values, productos.id_prod + "=" + prodId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
            break;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    static {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sUriMatcher.addURI(base.AUTHORITY, "productos", PRODUCTOS);
        sUriMatcher.addURI(base.AUTHORITY, "productos/#", PROD_ID);
        //sUriMatcher.addURI(base.AUTHORITY, "live_folders/productos", LIVE_FOLDER_PROD);

        sProductosProjectionMap = new HashMap<String, String>();
        sProductosProjectionMap.put(productos.id_prod, productos.id_prod);
        sProductosProjectionMap.put(productos.cod_prod, productos.cod_prod);
        sProductosProjectionMap.put(productos.num_serie, productos.num_serie);
        sProductosProjectionMap.put(productos.descrip_prod, productos.descrip_prod);
        sProductosProjectionMap.put(productos.id_subcat, productos.id_subcat);
        sProductosProjectionMap.put(productos.nom_prod, productos.nom_prod);
        sProductosProjectionMap.put(productos.marca_prod, productos.marca_prod);
        sProductosProjectionMap.put(productos.mod_prod, productos.mod_prod);
        sProductosProjectionMap.put(productos.cont_uni, productos.cont_uni);
        sProductosProjectionMap.put(productos.uni_min, productos.uni_min);
        sProductosProjectionMap.put(productos.cont_uni_med, productos.cont_uni_med);
        sProductosProjectionMap.put(productos.contenido, productos.contenido);
        sProductosProjectionMap.put(productos.peso_neto, productos.contenido);
        sProductosProjectionMap.put(productos.alto_cm, productos.alto_cm);
        sProductosProjectionMap.put(productos.ancho_cm, productos.ancho_cm);
        sProductosProjectionMap.put(productos.fondo_cm, productos.fondo_cm);
        sProductosProjectionMap.put(productos.fabr, productos.fabr);
        sProductosProjectionMap.put(productos.fam_nec, productos.fam_nec);
        sProductosProjectionMap.put(productos.fam_prod, productos.fam_prod);
        sProductosProjectionMap.put(productos.clase_prod, productos.clase_prod);
        sProductosProjectionMap.put(productos.linea_prod, productos.linea_prod);
        sProductosProjectionMap.put(productos.tipo_prod, productos.tipo_prod);
        sProductosProjectionMap.put(productos.imagen, productos.imagen);
        sProductosProjectionMap.put(productos.hot, productos.hot);

        // Support for Live Folders.
        //sLiveFolderProjectionMap = new HashMap<String, String>();
        //sLiveFolderProjectionMap.put(LiveFolders._ID, productos.id_prod + " AS " +
                //LiveFolders._ID);
        //sLiveFolderProjectionMap.put(LiveFolders.NAME, productos.nom_prod + " AS " +
                //LiveFolders.NAME);
        // Add more columns here for more robust Live Folders.
    }
}
